
 //#include <TFT_HX8357.h> // Hardware-specific library

 //TFT_HX8357 tft = TFT_HX8357();       // Invoke custom library
 #include "Adafruit_HX8357.h"
 #include <SPI.h>
 #include "Adafruit_GFX.h"
 //Code used for HX8357D

 //Header connector dual row
 //Pining adapted to new connector
 #define BL 6
 #define SCREENMOSI 2 //command signals //not used
 //#define R5 ?? //D17 A cabler
 //#define R4 ?? //D16 A cabler
 #define R3 29 //D15
 #define R1 27 //D13
 #define G5 25 //D11
 #define G3 23 //D09
 #define G1 30 //D07
 #define B5 32 //D05
 #define B3 34 //D03
 #define B1 36 //D01
 #define NRESET 3 //used as RESX or RST
 #define NWR 4 //used as WRX or WR
 #define NCS 53 //used as CSX or CS
 #define R2 28 //D14
 //#define D12 26 //not used in 16-bits mode (always at 0 by the display)
 #define G4 24 //D10
 #define G2 22	//D8 to D15 on A port //D08
 #define G0 31 //D06
 #define B4 33 //D04
 #define B2 35 //D02
 //#define D00 37	//D0 to D7 on C port //not used in 16-bits mode (always at 0 by the display)
 #define NRD 7 //used as RDX or RD
 #define DNC 8 //used as DCX or RS
 #define DE 13 //High active
 #define PCLK 12 //used //Rising edge active
 #define HSYNC 11 //used //Low active
 #define VSYNC 10 //used //Low active

 // Use hardware SPI (on Uno, #13, #12, #11) and the above for CS/DC
 Adafruit_HX8357 tft = Adafruit_HX8357(NCS, DNC, NRESET);

 //Software variables
 int i, j;
 uint8_t tempvalue, _D00value, _D01value, _D02value, _D03value, _D04value, _D05value, _D06value, _D07value, _readdata, _tempreaddata, _read;
 uint8_t x;

void setup() {
  // initialize digital pin 13 as an output.
  pinMode(LED_BUILTIN, OUTPUT);
	digitalWrite(LED_BUILTIN, LOW); 
	Serial.begin(115200);

  //Prepare Power supply => OK
	//Power is applied directly through 3.3V from Arduino
  pinMode(BL, OUTPUT);
  digitalWrite(BL, HIGH);
	//End Prepare Power supply

  //Prepare command signals
	pinMode(B1, OUTPUT);
	pinMode(B2, OUTPUT);
	pinMode(B3, OUTPUT);
	pinMode(B4, OUTPUT);
	pinMode(B5, OUTPUT);
	pinMode(G0, OUTPUT);
	pinMode(G1, OUTPUT);
	pinMode(G2, OUTPUT);
	pinMode(G3, OUTPUT);
	pinMode(G4, OUTPUT);
	pinMode(G5, OUTPUT);
	pinMode(R1, OUTPUT);
	pinMode(R2, OUTPUT);
	pinMode(R3, OUTPUT);
	//pinMode(R4, OUTPUT);
	//pinMode(R5, OUTPUT);
	pinMode(NRESET, OUTPUT); //ok
	//pinMode(NWR, OUTPUT); //ok
	pinMode(NCS, OUTPUT); //ok
	pinMode(DNC, OUTPUT); //ok
	pinMode(NRD, OUTPUT); //ok
	digitalWrite(NRESET, HIGH);
	//digitalWrite(NWR, HIGH);
	digitalWrite(NCS, HIGH);
	digitalWrite(DNC, HIGH);
	digitalWrite(NRD, HIGH);
	//RGB signals
	pinMode(DE, OUTPUT); //ok
  pinMode(PCLK, OUTPUT); //ok
  pinMode(HSYNC, OUTPUT); //ok
  pinMode(VSYNC, OUTPUT); //ok

	digitalWrite(DE, LOW);
	digitalWrite(PCLK, LOW);
	digitalWrite(HSYNC, LOW);
	digitalWrite(VSYNC, LOW);
	delay(10);
	//End Prepare command signals

	//Toggle NRESET low to reset after power is applied
	digitalWrite(NRESET, HIGH);
	delay(50);
	digitalWrite(NRESET, LOW);
	delay(10);
	digitalWrite(NRESET, HIGH);
	delay(100);
	//End Toggle NRESET low to reset after power is applied

	//TFT Init => Prepare the display to RGB configuration
	//tft_init();
	Serial.println("HX8357D Test!");
	tft.begin(HX8357D);
	// read diagnostics (optional but can help debug problems)
	uint8_t x = tft.readcommand8(HX8357_RDPOWMODE);
	Serial.print("Display Power Mode: 0x"); Serial.println(x, HEX);
	x = tft.readcommand8(HX8357_RDMADCTL);
	Serial.print("MADCTL Mode: 0x"); Serial.println(x, HEX);
	x = tft.readcommand8(HX8357_RDCOLMOD);
	Serial.print("Pixel Format: 0x"); Serial.println(x, HEX);
	x = tft.readcommand8(HX8357_RDDIM);
	Serial.print("Image Format: 0x"); Serial.println(x, HEX);
	x = tft.readcommand8(HX8357_RDDSDR);
	Serial.print("Self Diagnostic: 0x"); Serial.println(x, HEX);
	//End TFT Init => Prepare the display to RGB configuration

	//tft.fillScreen(HX8357_RED);
	//while(true);
	//Force unused signals
	digitalWrite(NCS, HIGH);
	digitalWrite(DNC, HIGH);
	digitalWrite(NRD, HIGH);
	digitalWrite(NWR, HIGH);

	//Prepare green color to display
	digitalWrite(B1, 0);
	digitalWrite(B2, 0);
	digitalWrite(B3, 0);
	digitalWrite(B4, 0);
	digitalWrite(B5, 0);
	digitalWrite(G0, 1);
	digitalWrite(G1, 1);
	digitalWrite(G2, 1);
	digitalWrite(G3, 1);
	digitalWrite(G4, 1);
	digitalWrite(G5, 1);
	digitalWrite(R1, 0);
	digitalWrite(R2, 0);
	digitalWrite(R3, 0);
	//digitalWrite(R4, 0);
	//digitalWrite(R5, 1);
	//End Prepare color to display

	//Setup is finished
  digitalWrite(LED_BUILTIN, HIGH); 

	start_image();
}

void loop() {
	for(int j=0;j<2500;j++)
	{
		digitalWrite(PCLK, LOW);
		delayMicroseconds(1);
		digitalWrite(PCLK, HIGH);
		delayMicroseconds(1);
	}
	digitalWrite(HSYNC, LOW);
	digitalWrite(PCLK, LOW);
	delayMicroseconds(1);
	digitalWrite(PCLK, HIGH);
	delayMicroseconds(1);
	digitalWrite(HSYNC, HIGH);

}

void start_image()
{
	digitalWrite(PCLK, LOW);
	digitalWrite(VSYNC, LOW);
	digitalWrite(HSYNC, LOW);
	digitalWrite(DE, HIGH);
	digitalWrite(PCLK, HIGH); //ready to write 1st line
	delayMicroseconds(1);
	digitalWrite(PCLK, LOW);
	digitalWrite(VSYNC, HIGH);
	digitalWrite(HSYNC, HIGH);
	digitalWrite(PCLK, HIGH); //Next PCLK will move the pixel
}

